//package com.example.bober.badugi;

//import android.util.Log;

import java.util.Random;

public class Room {

    private int ilosc_graczy;
    private Random random;
    private int[] tab;
    private int[][] gra;
    int dealer_buton;
    int mala;
    int duza;
    private int smal;
    private int big;
    private Talia talia;
    private int k[][];
    protected int poz;
    private int pieniadze[];
    protected Licytacja licytacja;
    int n;
    boolean wym = false;
    private int pozostalo_w_grze;
    private int liczba_tur;

    protected Room(int ilosc_graczy, int smal, int big, int kasa){
        this.ilosc_graczy = ilosc_graczy;
        this.smal = smal;
        this.big = big;
        this.random = new Random();
        tab = new int[ilosc_graczy];
        talia = new Talia();
        k = new int[ilosc_graczy][4];
        gra = new int[2][ilosc_graczy];
        pieniadze = new int[ilosc_graczy];
        for(int i = 0; i < ilosc_graczy; i++)
            pieniadze[i] = kasa;
        licytacja = new Licytacja(ilosc_graczy, smal, big);
        this.n = ilosc_graczy;
        pozostalo_w_grze = ilosc_graczy;
        liczba_tur = 6;
    }

    protected void start(){
        //pozostalo_w_grze = 1;
        //liczba_tur = -1;
        dealer_buton = losuj_button();
        //Log.d("button", Integer.toString(dealer_buton));
        //Stol.dealer(dealer_buton, 'd', ilosc_graczy);
        ciemna_mala();
        pieniadze[mala] -= smal;
        gra[0][mala] = 1;
        n--;
        licytacja.postawil(smal, poz);
        ciemna_duza();
        pieniadze[duza] -= big;
        gra[0][duza] = 1;
        n--;
        licytacja.postawil(big, poz);
        rozdaj_karty();
        poz = (duza+1)%ilosc_graczy;
        ustaw();

        //gra[0] = 1;
        //tab[1] = 1;

        //for(int i = 0; i < ilosc_graczy; i++)
            //Log.d("karty"+Integer.toString(i), Integer.toString(k[i][0]) + " " + Integer.toString(k[i][1]) + " " + Integer.toString(k[i][2]) + " " + Integer.toString(k[i][3]));

    }

    protected void zmien(){
        //Log.d("n", Integer.toString(n));
        //Log.d("pozostalo_w_grze", Integer.toString(pozostalo_w_grze));
        //Log.d("liczba_tur", Integer.toString(liczba_tur));
        boolean w = true;
        if(pozostalo_w_grze < 2){
            //Stol.koniec_gry();
            w = false;
        }
        else if(liczba_tur < 0){
            kto_wygral();
            //Log.d("wygral", "zrob kto wygral");
            w = false;
        }
        else if(n > 0 && liczba_tur >= 0) {
            //Stol.czysc_dilera(dealer_buton, mala, duza, ilosc_graczy);
            dealer_buton = dealer_buton - 1;
            if (dealer_buton < 0)
                dealer_buton = ilosc_graczy - 1;
            poz = (poz + 1) % ilosc_graczy;
            //Log.d("poz+1", Integer.toString(poz));
            mala = mala - 1;
            if (mala < 0)
                mala = ilosc_graczy - 1;
            //Log.d("mala+1", Integer.toString(mala));
            duza = duza - 1;
            if (duza < 0)
                duza = ilosc_graczy - 1;
            //Log.d("duza+1", Integer.toString(duza));
        }
        else if(n == 0 && liczba_tur >= 0){
            n = pozostalo_w_grze;
            ustaw();
            if(wym) {
                wym = false;
                //tura();
            }
            else {
                wym = true;
                //tura();
            }
            tura();
            //for (int i = 0; i < ilosc_graczy; i++)
                //gra[0][i] = 0;
        }
        if(w) {
            boolean q = false;
            boolean t = true;
            while (t) {
                if (tab[poz] == 0 && gra[0][poz] == 0 && gra[1][poz] == 0) {
                    if(pieniadze[poz] == 0 && liczba_tur%2 == 0) {
                        n--;
                        poz = (poz + 1) % ilosc_graczy;
                        //Log.d("poz+1", Integer.toString(poz));
                        mala = mala - 1;
                        if (mala < 0)
                            mala = ilosc_graczy - 1;
                        //Log.d("mala+1", Integer.toString(mala));
                        duza = duza - 1;
                        if (duza < 0)
                            duza = ilosc_graczy - 1;
                        //Log.d("duza+1", Integer.toString(duza));
                        dealer_buton = dealer_buton - 1;
                        if (dealer_buton < 0)
                            dealer_buton = ilosc_graczy - 1;
                        if (n == 0) {
                            q = true;
                            t = false;

                        }
                    }
                    else {
                        //Stol.widok(poz, ilosc_graczy);
                        //Stol.kar(k[poz][0], k[poz][1], k[poz][2], k[poz][3]);
                        //Stol.dealer(dealer_buton, 'd', ilosc_graczy);
                        //Stol.dealer(mala, 'm', ilosc_graczy);
                        //Stol.dealer(duza, 'b', ilosc_graczy);
                        //Stol.kasa(poz, pieniadze, ilosc_graczy);
                        //Log.d("poz", Integer.toString(poz));
                        //Log.d("mala", Integer.toString(mala));
                        //Log.d("duza", Integer.toString(duza));
                        //if (pieniadze[poz] < licytacja.zworc_max())
                            //Stol.wolno = false;
                        //else
                            //Stol.wolno = true;
                        t = false;
                    }
                } else {
                    //Log.d("tab[poz]", Integer.toString(tab[poz]));
                    //Log.d("gra[0][poz]", Integer.toString(gra[0][poz]));
                    //Log.d("gra[1][poz]", Integer.toString(gra[1][poz]));
                    poz = (poz + 1) % ilosc_graczy;
                    //Log.d("poz+1", Integer.toString(poz));
                    mala = mala - 1;
                    if (mala < 0)
                        mala = ilosc_graczy - 1;
                    //Log.d("mala+1", Integer.toString(mala));
                    duza = duza - 1;
                    if (duza < 0)
                        duza = ilosc_graczy - 1;
                    //Log.d("duza+1", Integer.toString(duza));
                    dealer_buton = dealer_buton - 1;
                    if (dealer_buton < 0)
                        dealer_buton = ilosc_graczy - 1;
                }
            }
            if(q)
                tura();
        }

    }

    protected void ustaw(){
        //Stol.czysc_dilera(dealer_buton, mala, duza, ilosc_graczy);
        switch (ilosc_graczy){
            case 6:{
                while(dealer_buton != 3){

                    dealer_buton = (dealer_buton+1)%ilosc_graczy;
                    mala = (mala+1)%ilosc_graczy;
                    duza = (duza+1)%ilosc_graczy;

                }
                break;
            }
            case 5:{
                while(dealer_buton != 2){

                    dealer_buton = (dealer_buton+1)%ilosc_graczy;
                    mala = (mala+1)%ilosc_graczy;
                    duza = (duza+1)%ilosc_graczy;

                }
                break;
            }
            case 4:{
                while(dealer_buton != 1){

                    dealer_buton = (dealer_buton+1)%ilosc_graczy;
                    mala = (mala+1)%ilosc_graczy;
                    duza = (duza+1)%ilosc_graczy;

                }
                break;
            }
            case 3:{
                while(dealer_buton != 0){

                    dealer_buton = (dealer_buton+1)%ilosc_graczy;
                    mala = (mala+1)%ilosc_graczy;
                    duza = (duza+1)%ilosc_graczy;

                }
                break;
            }
            case 2:{
                while(dealer_buton != 1){

                    dealer_buton = (dealer_buton+1)%ilosc_graczy;
                    mala = (mala+1)%ilosc_graczy;
                    duza = (duza+1)%ilosc_graczy;

                }
                break;
            }
        }

        //Log.d("dealer", Integer.toString(dealer_buton));
        //Log.d("mala", Integer.toString(mala));
        //Log.d("duzy", Integer.toString(duza));
        //Log.d("poz", Integer.toString(poz));
        //Log.d("po petli", "while");
        //Stol.dealer(dealer_buton, 'd', ilosc_graczy);
        //Stol.dealer(mala, 'm', ilosc_graczy);
        //Stol.dealer(duza, 'b', ilosc_graczy);
        //Stol.widok(poz, ilosc_graczy);
        //Stol.kasa(poz, pieniadze, ilosc_graczy);
        //Stol.kar(k[poz][0], k[poz][1], k[poz][2], k[poz][3]);
        //Log.d("n", Integer.toString(n));
        //Log.d("pozostalo_w_grze", Integer.toString(pozostalo_w_grze));
        //Log.d("liczba_tur", Integer.toString(liczba_tur));

    }

    private void rozdaj_karty(){
        talia.tasuj();
        for(int i = 0; i < ilosc_graczy; i++){
            for (int j = 0; j < 4; j++){
                int karta = talia.daj_karte();
                k[i][j] = karta;
            }
        }
    }

    protected void ciemna_duza(){
        int i = (mala+1)%ilosc_graczy;
        boolean t = true;
        while (t){
            if(tab[i] == 0){
                //Stol.dealer(i, 'b', ilosc_graczy);
                duza = i;
                //Log.d("duza", Integer.toString(i));
                t = false;
            }
            i = ++i%ilosc_graczy;
        }
    }

    protected void ciemna_mala(){
        int i = (dealer_buton+1)%ilosc_graczy;
        boolean t = true;
        while (t){
            if(tab[i] == 0){
                //Stol.dealer(i, 'm', ilosc_graczy);
                mala = i;
                //Log.d("mala", Integer.toString(i));
                t = false;
            }
            i += 1;
            i = i%ilosc_graczy;
        }
    }

    protected int losuj_button() {
        int[] gracze = new int[ilosc_graczy];
        int l = ilosc_graczy;
        for (int i = 0; i < ilosc_graczy; i++) {
            gracze[i] = i;
        }

        while (l > 0) {
            int losowa = liczba_losowa(l);
            if(losowa < l - 1){
                int a = gracze[l-1];
                gracze[l-1] = gracze[losowa];
                gracze[losowa] = a;
            }
            l--;
        }

        return gracze[0];
        //return liczba_losowa(4);
    }

    int liczba_losowa(int zakres){
        return random.nextInt(zakres);
    }

    protected void pass(){
        gra[1][poz] = 1;
        n--;
        pozostalo_w_grze--;
        //Log.d("pass", Integer.toString(poz));
    }

    protected void all(){
        licytacja.postawil(pieniadze[poz] ,poz);
        pieniadze[poz] = 0;
        gra[0][poz] = 1;
        n--;
    }

    protected void doluz(){
        //Log.d("max", Integer.toString(licytacja.zworc_max()));
        pieniadze[poz] -= licytacja.zworc_max();
        licytacja.wyrownal(poz);
        n--;

    }

    protected void pierwsza(){
        if(smal > big){
            licytacja.postawil(smal, poz);
            pieniadze[poz] -= smal;
        }
        else {
            licytacja.postawil(big, poz);
            pieniadze[poz] -= big;
        }
        n--;
    }

    protected int maxi(){
        return pieniadze[poz];
    }

    protected boolean wlasne(int ile){
        boolean t = licytacja.raise(ile, poz);
        if(t)
            pieniadze[poz] -= ile;
        return t;
    }

    protected void wymien(int it1, int it2, int it3, int it4){

        if(it1 == 1){
            int karta = talia.daj_karte();
            k[poz][0] = karta;
        }
        if(it2 == 1){
            int karta = talia.daj_karte();
            k[poz][1] = karta;
        }
        if(it3 == 1){
            int karta = talia.daj_karte();
            k[poz][2] = karta;
        }
        if(it4 == 1){
            int karta = talia.daj_karte();
            k[poz][3] = karta;
        }
        //Log.d("karty"+Integer.toString(poz), Integer.toString(k[poz][0]) + " " + Integer.toString(k[poz][1]) + " " + Integer.toString(k[poz][2]) + " " + Integer.toString(k[poz][3]));
        n--;

    }

    protected void podjol_decyzje(){
        gra[0][poz] = 1;
        n--;
    }

    protected void tura(){
        for (int i = 0; i < ilosc_graczy; i++) {
            gra[0][i] = 0;
            //Log.d("gra[0][i]", Integer.toString(gra[0][i]));
        }
        if (wym) {
            //Stol.wolno = false;
            //Stol.wymien = true;
            //Stol.fold = false;
            //Stol.bet = false;
            //Stol.check = false;
            //Stol.call = false;
            //Stol.all_in = false;
            //Log.d("wymien", "wymien karty");
        }
        else {
            licytacja.wyzeruj();
            //Stol.wolno = true;
            //Stol.wymien = false;
            //Stol.fold = true;
            //Stol.bet = true;
            //Stol.check = true;
            //Stol.call = false;
            //Stol.all_in = true;
            //Log.d("wymien", "licytacja");
        }
        liczba_tur--;
        //Log.d("tura", Integer.toString(liczba_tur));
    }

    private void  kto_wygral(){
        int wyg[] = talia.wygral(k, ilosc_graczy, tab, gra);
        if(wyg[1] == 0)
            pieniadze[wyg[0]] += licytacja.wygrana(wyg[0]);
        licytacja.wyzeruj();
        //Log.d("wygral", Integer.toString(wyg[0]));
        //Log.d("wygrana", Integer.toString(licytacja.wygrana(wyg[0])));

    }

}
